package com.xiaobao.campusLostFoundAfter.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xiaobao.campusLostFoundAfter.mapper.LostItemMapper;
import com.xiaobao.campusLostFoundAfter.pojo.Comment;
import com.xiaobao.campusLostFoundAfter.pojo.LostItem;
import com.xiaobao.campusLostFoundAfter.service.LostItemService;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class LostItemServiceImpl implements LostItemService {
    private final LostItemMapper lostItemMapper;

    public LostItemServiceImpl(LostItemMapper lostItemMapper) {
        this.lostItemMapper = lostItemMapper;
    }

    /**
     * 根据分页请求获取丢失的物品列表
     *
     * @return 返回一个包含丢失物品列表的PageResult对象
     */
    @Override
    public PageInfo<LostItem> getLostItemByPage(int pageNum, int pageSize,
                                                Integer categoryId, Integer status,
                                                String keyword) {
        // 开启分页
        PageHelper.startPage(pageNum, pageSize);

        // 执行查询
        List<LostItem> lostItems = lostItemMapper.findByPage(categoryId, status, keyword);

        // 封装分页结果
        return new PageInfo<>(lostItems);
    }

    /**
     * 查询失物招领物件总数
     *
     * @return 返回失物招领物件的总数
     */
    @Override
    public int selectLostItemCount() {
        return lostItemMapper.selectLostItemCount();
    }

    /**
     * 添加丢失的物品到数据库中
     * 此方法接收一个LostItem对象作为参数，表示丢失的物品信息
     * 通过调用LostItemMapper中的addLostItem方法将物品信息添加到数据库中
     *
     * @param lostItem 发布丢失东西信息，包含需要添加到数据库的物品详情
     * @return 返回添加物品操作的影响行数，通常为1表示成功，其他值表示失败
     */
    @Override
    public int addLostItem(LostItem lostItem) {
        return lostItemMapper.addLostItem(lostItem);
    }

    /**
     * 更新失物信息
     * 此方法通过调用LostItemMapper中的updateLostItem方法来更新数据库中失物的详细信息
     * 它主要用于更新界面或后台管理系统中修改失物信息后，将新的信息保存到数据库
     *
     * @param lostItem 待更新的失物对象，包含需要更新的物品信息
     * @return 更新操作影响的行数，通常为1，如果返回0表示更新失败或指定的物品不存在
     */
    @Override
    public int updateLostItem(LostItem lostItem) {
        return lostItemMapper.updateLostItem(lostItem);
    }

    /**
     * 根据ID删除丢失的物品信息
     * 此方法用于在数据库中删除指定ID的丢失物品记录
     * 主要用于数据清理或撤销错误录入的操作
     *
     * @param id 要删除的丢失物品的ID，这是一个唯一的标识符
     * @return 返回删除操作影响的行数，通常为1，如果ID不存在，则可能为0
     */
    @Override
    public int deleteLostItem(Integer id) {
        return lostItemMapper.deleteLostItem(id);
    }

    /*
     * 根据失物id查询物品信息
     * */
    @Override
    public LostItem getLostItemById(Integer id) {
        return lostItemMapper.getLostItemById(id);
    }

    // 根据用户id查询失物招领信息
    @Override
    public List<LostItem> getLostItemByUserId(String userId) {
        return lostItemMapper.getLostItemByUserId(userId);
    }

    // 添加评论
    @Override
    public int addComment(String content, String userId, Integer itemId) {
        String type = "Lost";
        //获取当前时间
        Date createTime = new Date();
        return lostItemMapper.addComment(content, userId, itemId, type, createTime);
    }

    // 获取评论
    @Override
    public List<Comment> getComments(Integer itemId) {
        String type = "Lost";
        return lostItemMapper.getComments(itemId, type);
    }

    @Override
    public int updateStatus(Integer id, Integer status) {
        return lostItemMapper.updateStatus(id, status);
    }

    @Override
    public PageInfo<LostItem> getAllLostItemsByPage(Integer page, Integer pageSize) {
        PageHelper.startPage(page, pageSize);
        List<LostItem> lostItems = lostItemMapper.getAllLostItemsByPage();
        return new PageInfo<>(lostItems);
    }

    @Override
    public PageInfo<LostItem> getAllOrderByPage(Integer page, Integer pageSize) {
        PageHelper.startPage(page, pageSize);
        List<LostItem> lostItems = lostItemMapper.getAllOrderByPage();
        return new PageInfo<>(lostItems);
    }
}
